#ifndef DEVICE_H
#define DEVICE_H
#include "UserManager.h"
#include "Database.h"
#include <string>
#include <mutex>
#include <atomic>
#include <unordered_map>
#include <functional>
// 设备类型枚举
enum class DeviceType {
    CAMERA,
    THERMOSTAT,
    LIGHT,
    LOCK,
    SENSOR
};
// 设备状态枚举
enum class DeviceStatus {
    ONLINE,
    OFFLINE,
    BUSY,
    ERROR
};
// 设备异常类型
class DeviceException : public std::runtime_error {
public:
    explicit DeviceException(const std::string& msg, int deviceId = -1)
        : std::runtime_error("Device " + std::to_string(deviceId) + 
                           " Error: " + msg),
          deviceId(deviceId) {}
    
    int getDeviceId() const noexcept { return deviceId; }
private:
    int deviceId;
};
class Device {
public:
    // 设备配置参数结构
    struct Config {
        std::string name;
        std::string ipAddress;
        int pollInterval = 5000;  // 状态轮询间隔（毫秒）
    };
    // 构造/析构
    Device(int id, DeviceType type, const Config& config);
    virtual ~Device();
    // 基础信息访问
    int getId() const noexcept { return id; }
    DeviceType getType() const noexcept { return type; }
    DeviceStatus getStatus() const noexcept { return status.load(); }
    // 设备控制接口（需权限验证）
    void control(const std::string& sessionToken, 
                const std::string& command,
                const std::unordered_map<std::string, std::string>& params = {});
    // 状态更新接口
    void updateStatus(DeviceStatus newStatus);
    // 配置管理
    void updateConfig(const Config& newConfig);
    Config getCurrentConfig() const;
    // 事件回调注册
    using StatusCallback = std::function<void(DeviceStatus)>;
    void registerStatusCallback(const StatusCallback& callback);
    // 禁止拷贝
    Device(const Device&) = delete;
    Device& operator=(const Device&) = delete;
protected:
    // 设备类型专用控制接口（由子类实现）
    virtual void executeCommand(const std::string& command,
                               const std::unordered_map<std::string, std::string>& params) = 0;
private:
    // 内部状态校验
    void validateOperation() const;
    // 设备唯一标识
    const int id;
    const DeviceType type;
    // 线程安全的状态管理
    std::atomic<DeviceStatus> status;
    mutable std::mutex statusMutex;
    // 配置管理
    Config currentConfig;
    mutable std::mutex configMutex;
    // 事件回调列表
    std::vector<StatusCallback> statusCallbacks;
    mutable std::mutex callbackMutex;
    // 数据库同步锁
    mutable std::mutex dbSyncMutex;
};
// 设备工厂函数声明
using DeviceFactory = std::function<std::unique_ptr<Device>(int id, Device::Config)>;
extern const std::unordered_map<DeviceType, DeviceFactory> deviceFactories;
#endif // DEVICE_H